const crypto = require('crypto');

/**
 * 微信小程序用户数据的解密类
 */
class WXBizDataCrypt {
  /**
   * 构造函数
   * @param {string} appId 小程序的appId
   * @param {string} sessionKey 通过code2Session获取的 session_key
   */
  constructor(appId, sessionKey) {
    this.appId = appId;
    this.sessionKey = sessionKey;
  }

  /**
   * 解密数据
   * @param {string} encryptedData 包括敏感数据在内的完整用户信息的加密数据
   * @param {string} iv 加密算法的初始向量
   * @return {Object} 解密后的原文
   */
  decryptData(encryptedData, iv) {
    // base64 decode
    const sessionKey = Buffer.from(this.sessionKey, 'base64');
    encryptedData = Buffer.from(encryptedData, 'base64');
    iv = Buffer.from(iv, 'base64');

    try {
      // 解密
      const decipher = crypto.createDecipheriv('aes-128-cbc', sessionKey, iv);
      // 设置自动 padding 为 true，删除填充补位
      decipher.setAutoPadding(true);
      let decoded = decipher.update(encryptedData, 'binary', 'utf8');
      decoded += decipher.final('utf8');
      decoded = JSON.parse(decoded);

      if (decoded.watermark.appid !== this.appId) {
        throw new Error('Illegal Buffer');
      }

      return decoded;
    } catch (err) {
      throw new Error('Illegal Buffer');
    }
  }
}

module.exports = { WXBizDataCrypt }; 